home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1993 Michael D. Bayne.
- * All rights reserved.
- *
- * Please see the documentation accompanying the distribution for distribution and disclaimer information.
- */
-
- #include <exec/types.h>
- #include <exec/memory.h>
-
- #include <intuition/intuition.h>
- #include <intuition/screens.h>
-
- #include <dos/dos.h>
-
- #include <graphics/gfxbase.h>
- #include <graphics/gfxmacros.h>
- #include <graphics/copper.h>
- #include <graphics/videocontrol.h>
- #include <hardware/custom.h>
-
- #include <clib/exec_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/alib_protos.h>
- #include <clib/utility_protos.h>
-
- #include "Moire.h"
- #include "/defs.h"
- #include "/utility.h"
-
- struct mPrefObject {
- LONG xSpeed, ySpeed, Trail, numLines, Cycle;
- };
-
- #pragma libcall GfxBase LoadRGB32 372 9802
-
- extern struct mPrefObject nP;
- extern ULONG Depth, Mode;
- extern UBYTE *prefData;
-
- VOID agaInit( struct Screen *Screen, LONG numCols )
- {
- ULONG *agaTable, i, tPos;
-
- agaTable = AllocVec(( numCols*3 + 2 )*sizeof( ULONG ), MEMF_CLEAR );
-
- agaTable[0] = ( numCols<<16 );
- agaTable[1] = agaTable[2] = agaTable[3] = 0;
- tPos = 3;
- for( i = 1; i < numCols/3+1; ++i ) {
- agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
- agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
- agaTable[++tPos] = (0xFFFFFF);
- }
- for( i = 1; i < numCols/3+1; ++i ) {
- agaTable[++tPos] = (0xFFFFFF);
- agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
- agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
- }
- for( i = 1; i < numCols/3+1; ++i ) {
- agaTable[++tPos] = (0xFFFFFF)|((3*i)<<24);
- agaTable[++tPos] = (0xFFFFFF);
- agaTable[++tPos] = (0xFFFFFF)|((numCols-3*i)<<24);
- }
- agaTable[++tPos] = 0;
-
- LoadRGB32( &(Screen->ViewPort), agaTable );
-
- FreeVec( agaTable );
- }
-
- VOID ecsInit( struct Screen *Screen, LONG numCols )
- {
- UWORD Table6[] = { 0, 0x0F20, 0x0E30, 0x0C50, 0x0B60, 0x0980, 0x0890, 0x06B0,
- 0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3, 0x00C5, 0x00B6, 0x0098, 0x006B,
- 0x005C, 0x003E, 0x002F, 0x020F, 0x030E, 0x050C, 0x060B, 0x0809, 0x0908,
- 0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00, 0x0F00, 0x0F20, 0x0E30, 0x0C50,
- 0x0B60, 0x0980, 0x0890, 0x06B0, 0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3,
- 0x00C5, 0x00B6, 0x0098, 0x006B, 0x005C, 0x003E, 0x002F, 0x020F, 0x030E,
- 0x050C, 0x060B, 0x0809, 0x0908, 0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00 };
- UWORD Table5[] = { 0, 0x0F20, 0x0E30, 0x0C50, 0x0B60, 0x0980, 0x0890, 0x06B0,
- 0x05C0, 0x03E0, 0x02F0, 0x00F2, 0x00E3, 0x00C5, 0x00B6, 0x0098, 0x006B,
- 0x005C, 0x003E, 0x002F, 0x020F, 0x030E, 0x050C, 0x060B, 0x0809, 0x0908,
- 0x0B06, 0x0C05, 0x0E03, 0x0F02, 0x0F00 };
- UWORD Table4[] = { 0, 0x0E03, 0x0B06, 0x0909, 0x060B, 0x030E, 0x003E, 0x006B,
- 0x0099, 0x00B6, 0x00E3, 0x03E0, 0x06B0, 0x0990, 0x0B60, 0x0E30 };
- UWORD Table3[] = { 0, 0x0E00, 0x0770, 0x00E0, 0x0077, 0x000E, 0x0707 };
- UWORD Table2[] = { 0, 0x0E00, 0x00E0, 0x000E };
- UWORD Table1[] = { 0, 0x0FFF };
- UWORD *Table[6];
-
- Table[0] = Table1; Table[1] = Table2; Table[2] = Table3; Table[3] = Table4;
- Table[4] = Table5, Table[5] = Table6;
-
- LoadRGB4( &(Screen->ViewPort), Table[Screen->BitMap.Depth-1], numCols );
- }
-
- VOID blank( VOID )
- {
- struct mPrefObject *mP;
- struct Screen *MoireScr;
- struct RastPort *rp;
-
- ULONG numCols, i, j, k, n, Trail, xSpeed, ySpeed;
- WORD Wid, Hei, **cx, **cy, *dx, *dy, nl;
-
- if( MoireWnd ) mP = &nP;
- else mP = ( struct mPrefObject * )prefData;
-
- xSpeed = mP->xSpeed;
- ySpeed = mP->ySpeed;
- nl = mP->numLines;
- Trail = mP->Trail;
-
- if(!( cx = AllocVec( nl * sizeof( WORD * ), MEMF_CLEAR ))) goto exit;
- if(!( cy = AllocVec( nl * sizeof( WORD * ), MEMF_CLEAR ))) goto exit;
- if(!( dx = AllocVec( nl * sizeof( WORD ), MEMF_CLEAR ))) goto exit;
- if(!( dy = AllocVec( nl * sizeof( WORD ), MEMF_CLEAR ))) goto exit;
-
- if(!( MoireScr = OpenScreenTags( 0l, SA_DisplayID, Mode, SA_Depth, Depth, SA_Quiet, TRUE, SA_Behind, TRUE,
- SA_Overscan, OSCAN_STANDARD, TAG_DONE ))) goto exit;
-
- rp = &( MoireScr->RastPort );
- Wid = MoireScr->Width;
- Hei = MoireScr->Height;
-
- numCols = (( 1 << rp->BitMap->Depth )-1)%3 ? ( 1 << rp->BitMap->Depth )-1 : ( 1 << rp->BitMap->Depth );
-
- if( numCols == 1 ) numCols = 2;
-
- for( k = 0; k < nl; k++ ) {
- if(!( cx[k] = AllocVec( Trail * sizeof( UWORD ), MEMF_CLEAR ))) goto exit;
- if(!( cy[k] = AllocVec( Trail * sizeof( UWORD ), MEMF_CLEAR ))) goto exit;
- }
-
- SetRGB4( &(MoireScr->ViewPort), 0, 0, 0, 0 );
-
- switch( mP->Cycle ) {
- case 0:
- if( MoireScr->BitMap.Depth > 6 ) agaInit( MoireScr, numCols );
- else ecsInit( MoireScr, numCols );
- break;
- case 1:
- SetRGB4( &(MoireScr->ViewPort), 1, RangeRand( 14 ) + 1, RangeRand( 14 ) + 1, RangeRand( 14 ) + 1 );
- break;
- case 2:
- SetRGB4( &(MoireScr->ViewPort), 1, 15, 15, 15 );
- break;
- case 3:
- setCopperList( Hei, 1, &( MoireScr->ViewPort ));
- break;
- }
-
- for( k = 0; k < nl; k++ ) {
- cx[k][1] = RangeRand( Wid - 2 ) + 1;
- cy[k][1]= RangeRand( Hei - 2 ) + 1;
- dx[k] = RangeRand( xSpeed ) + 1;
- dy[k] = RangeRand( ySpeed ) + 1;
- }
- i = 0; j = 0;
-
- BlankMousePointer();
- ScreenToFront( MoireScr );
-
- while(!(SetSignal(0,0) & SIGBREAKF_CTRL_C )) {
-
- WaitTOF();
-
- i = (i+1) % Trail;
- n = (i+1) % Trail;
- j = (j+1) % 255;
-
- if( !mP->Cycle ) SetAPen( rp, (j*(numCols-1))/255+1 );
- else SetAPen( rp, 1 );
-
- for( k = 0; k < nl; k++ ) {
- if( cx[k][i] >= Wid ) {
- dx[k] = -1 * RangeRand( xSpeed ) - 1;
- cx[k][i] = Wid-1;
- } else if( cx[k][i] < 0 ) {
- dx[k] = RangeRand( xSpeed ) + 1;
- cx[k][i] = 0;
- }
- if( cy[k][i] >= Hei ) {
- dy[k] = -1 * RangeRand( ySpeed ) - 1;
- cy[k][i] = Hei-1;
- } else if( cy[k][i] < 0 ) {
- dy[k] = RangeRand( ySpeed ) + 1;
- cy[k][i] = 0;
- }
- }
-
- Move( rp, cx[0][i], cy[0][i] );
- for( k = 1; k < nl; k++ ) Draw( rp, cx[k][i], cy[k][i] );
- if( nl > 2 ) Draw( rp, cx[0][i], cy[0][i] );
-
- SetAPen( rp, 0 );
-
- Move( rp, cx[0][n], cy[0][n] );
- for( k = 1; k < nl; k++ ) Draw( rp, cx[k][n], cy[k][n] );
- if( nl > 2 ) Draw( rp, cx[0][n], cy[0][n] );
-
- for( k = 0; k < nl; k++ ) {
- cx[k][n] = cx[k][i] + dx[k];
- cy[k][n] = cy[k][i] + dy[k];
- }
- }
-
- exit:
- SetSignal( 0L, SIGBREAKF_CTRL_C );
-
- if( cx ) {
- for( k = 0; k < nl; k++ ) if( cx[k] ) FreeVec( cx[k] );
- FreeVec( cx );
- }
- if( cy ) {
- for( k = 0; k < nl; k++ ) if( cy[k] ) FreeVec( cy[k] );
- FreeVec( cy );
- }
- if( dx ) FreeVec( dx );
- if( dy ) FreeVec( dy );
-
- UnblankMousePointer();
- if( MoireScr ) CloseScreen( MoireScr );
- }
-